Skip to content

rabotaet#12

Open
alexanderskiba wants to merge 2 commits into
kib-courses:masterfrom
alexanderskiba:master
Open

rabotaet#12
alexanderskiba wants to merge 2 commits into
kib-courses:masterfrom
alexanderskiba:master

Conversation

@alexanderskiba

Copy link
Copy Markdown

No description provided.

@romvano romvano left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Странная логика с Patient.current_row_idx. Есть подозрения, что будет работать неправильно.
Много однотипного кода, который стоило бы параметризовать. Мб стоит переделать некоторую логику условий на противоположные для уменьшения размера кода

Comment thread homework/patient.py
# Проверка номера документа
def _check_doc_id(self, val, doc_type): # в doc_type будем передавать значение из dict объекта по ключу document_type
_valid_len = {
'Паспорт' : 10,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

константы лучше хранить в переменных

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Мне кажется, удобнее будет хранить в словаре, потому что константы семантически связаны и нет смысла записывать каждую в отдельную переменную, так будет сложнее поддерживать

Comment thread homework/patient.py
def __get__(self, obj, objtype):
return obj.__dict__[self.name] # вернем значение атрибута по ключу(названию атрибута)

def __set__(self, obj, val):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в этой функции довольно много повторяющегося кода: лучше как-то параметризовать

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлено

Comment thread homework/patient.py
def __init__(self,first_name,last_name, birth_date, phone, document_type, document_id):
self._info_logger = logging.getLogger('info_logger')

if not(first_name and last_name and birth_date

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

при том, что все аргументы конструктора - позиционные и обязательные, эта проверка не нужна

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь идет проверка не на пустоту аргумента, а на пустоту строки, листа, None итд

Comment thread homework/patient.py Outdated
f'{self.birth_date} {self.phone} {self.document_type} {self.document_id}')

@classmethod
def create(cls, first_name, last_name, birth_date, phone, document_type, document_id):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

поскольку никакие атрибуты класса в этом методе не используются, а также нет планируемого такого же поведения наследников класса, то метод стоит сделать статическим

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлено

Comment thread homework/patient.py
with open('patient.csv', 'r', newline='') as f:
reader = csv.reader(f, delimiter=';')
rows = [row for row in reader] # список списков с полями пациента
rows[self._row_idx] = data # элементу списка со всеми пациентами присваются данные конкретного пациента

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

кажется, этот атрибут всегда будет равен количеству сохраненных в текущей сессии объектов

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

увидел использование этого атрибута в PatientCollection. предыдущий комментарий - про тот случай, когда Patient при готовом файле создается впервые

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Атрибут self._row_idx хранит в себе индекс строки, в которой записан текущий объект пациента
Атрибут Patient.current_row_idx - указатель на новую строку файла, куда будет записан следующий пациент.
Он принадлежит классу, а значит общий для всех объектов.
При этом подразумевается, что при каждом "запуске программы" (пользовательской сессии) если существует файл, то существует объект PatientCollection,
который смотрит файл и устанавливает необходимые атрибуты у класса пациент.
Это необходимо для отражения изменения у объектов в файле, при повторном вызове метода save.
Если не хранить указатель на строку, то после изменения атрибута пациента и повторного вызова save в файле вместо изменения появится новая запись.

Comment thread homework/patient.py

with open('patient.csv', "a", newline='') as csv_file:
writer = csv.writer(csv_file, delimiter=';')
if not Patient.is_header_written: # Пишем заголовок в файл, он должен быть записан всего один раз, поэтому вот так

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

этот атрибут будет работать верно только при единственном запуске программы. Кажется, что, если запустить этот код для уже готового файла в первый раз, то что-то пойдет не так

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Атрибут Patient.is_header_written - флаг показывающий, что записана шапка таблицы.
Он принадлежит классу, а значит общий для всех объектов.
При этом подразумевается, что при каждом "запуске программы" (пользовательской сессии) если существует файл, то существует объект PatientCollection,
который смотрит файл и устанавливает необходимые атрибуты у класса пациент. Если объекта нет, а существуют только
объекты Patient, то заголовок будет записываться на каждой сессии. Если это неправильное поведение, то как обработать
запись заголовка в сессии без, объекта PatientCollection?

Comment thread homework/patient.py Outdated
p = Patient(*row) # Распакуем данные пациента из файла для создания объекта
p._saved = True # Теперь объект сохранен
p._row_idx = ind # Индекс объекта
self.patient_list.append(p) # Добавим пациента в список

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если файл огромный, то плохо всё хранить в оперативе

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправлено

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants